package godau.fynn.dsbdirect.activity.settings;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceScreen;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import godau.fynn.dsbdirect.Login;
import godau.fynn.dsbdirect.R;
import godau.fynn.dsbdirect.activity.LoginActivity;
import godau.fynn.dsbdirect.manager.LoginManager;

public class LoginSettingsActivity extends SettingsActivity {

    private static final int REQUEST_LOGIN = 0;

    public PreferenceFragment getPreferenceFragment() {
        return new PreferenceFragment();
    }

    public static class PreferenceFragment extends SettingsActivity.PreferenceFragment {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            final LoginManager loginManager = new LoginManager(sharedPreferences);

            // Load correct sharedPreferences
            getPreferenceManager().setSharedPreferencesName("default");

            // Thanks, https://stackoverflow.com/a/37745292
            addPreferencesFromResource(R.xml.preferences_none);
            PreferenceScreen preferenceScreen = this.getPreferenceScreen();

            findPreference("settings_none_description")
                    .setSummary(R.string.settings_login_description);

            // Add logins
            for (final Login l : loginManager.getLogins()) {
                Preference loginPreference = new Preference(getActivity());

                loginPreference.setTitle(l.getDisplayName());
                if (l.hasDisplayName()) {
                    loginPreference.setSummary(l.getId());
                }

                // Prompt for new display name
                loginPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                    @Override
                    public boolean onPreferenceClick(Preference preference) {

                        // Spawn editText layout
                        final View promptView = LayoutInflater.from(getActivity()).inflate(R.layout.edittext, null);
                        final EditText editText = promptView.findViewById(R.id.editText);

                        if (l.hasDisplayName()) {
                            editText.setText(l.getDisplayName());
                        }
                        new AlertDialog.Builder(getActivity())
                                .setTitle(getActivity().getString(R.string.settings_login_alias_popup, l.getId()))
                                .setMessage(R.string.settings_login_alias_popup_message)
                                .setView(promptView)
                                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        if (editText.length() <= 0) {
                                            // To allow display name to be set to school name automatically
                                            l.setDisplayName(null);
                                        } else {
                                            l.setDisplayName(editText.getText().toString());
                                        }
                                        // Write changed login alias to shared preferences
                                        loginManager.write();

                                        // Reload list by recreating
                                        getActivity().recreate();
                                    }
                                })
                                .setNegativeButton(R.string.cancel, null)
                                .setNeutralButton(R.string.settings_login_remove, new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {

                                        loginManager.removeLogin(l);

                                        // Reload list by recreating
                                        getActivity().recreate();
                                    }
                                })
                                .show();
                        return true;
                    }
                });

                preferenceScreen.addPreference(loginPreference);
            }

            // Add Add login button

            Preference newLoginPreference = new Preference(getActivity());
            newLoginPreference.setTitle(R.string.action_add_login);

            // TODO: This button could have a '+' icon, but depending on the theme, it would need to be black or white.

            newLoginPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
                @Override
                public boolean onPreferenceClick(Preference preference) {

                    startActivityForResult(new Intent(getActivity(), LoginActivity.class), REQUEST_LOGIN);

                    // TODO: A drawback of this button is that school name can only be set as display alias when its plan is viewed with parsing enabled, not immediately when added here.

                    return true;
                }
            });

            preferenceScreen.addPreference(newLoginPreference);

        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (resultCode == RESULT_OK) {
                getActivity().recreate();
            }
        }
    }
}
